from typing import Annotated

from pydantic import BaseModel, Field, WithJsonSchema, ConfigDict, ValidationError
from pydantic.dataclasses import dataclass


# 我们将介绍自定义 Pydantic 模型字段的可用机制： 默认值、JSON Schema 元数据、约束等。

class Model(BaseModel):
    first_name: str = Field(frozen=True)
    last_name: Annotated[str, Field(strict=True), WithJsonSchema({'extra': 'data'})]


# Pydantic 模型上的配置
print('------------------ 模型上的配置 -------------------------')


# 1 使用 model_config 类属性
class Model1(BaseModel):
    model_config = ConfigDict(str_max_length=5)

    v: str


# 2 使用类参数
class Model2(BaseModel, frozen=True):
    a: str


# Pydantic 数据类也支持配置
print('------------------ 数据类的配置 -------------------------')


@dataclass(config=ConfigDict(str_max_length=10, validate_assignment=True))
class User:
    name: str


user = User(name='John Doe')
try:
    user.name = 'x' * 20
except ValidationError as e:
    print(e)
